#pragma once
//形成网页给用户显示
#include <iostream>
#include <string>
#include <ctemplate/template.h> //使用渲染功能

#include "oj_model.hpp" //为了认识结构体struct Question
// #include "oj_model2.hpp"

namespace ns_view
{
    using namespace ns_model; 

    const std::string template_path = "./template_html/";
    class View
    {
    public:
        View(){}
        ~View(){}
    public:
        //第一个参数:所有题目的题目细节 第二个参数:输出型参数,返回的是构建出的网页内容
        void AllExpandHtml(const vector<struct Question> &questions, std::string *html)
        {
            // 要显示的内容： 题目的编号 题目的标题 题目的难度
            // 推荐使用表格显示
            
            // 1. 形成被渲染的网页的路径
            std::string src_html = template_path + "all_questions.html"; 
            // 2. 形成数据字典,名字为all_questions
            ctemplate::TemplateDictionary root("all_questions");
            for (const auto& q : questions) //遍历所有的题目细节
            {
                ctemplate::TemplateDictionary *sub = root.AddSectionDictionary("question_list");//在root内形成名字为question_list的子字典
                //往子字典里面添加数据
                sub->SetValue("number", q.number); //编号
                sub->SetValue("title", q.title);//题目
                sub->SetValue("star", q.star);//难度
            }

            //3. 获取被渲染的html   第一个参数:你要获取谁 -》 原始网页  第二个参数:是一个选项   DO_NOT_STRIP:保持原貌(不去除空格等)
            ctemplate::Template *tpl = ctemplate::Template::GetTemplate(src_html, ctemplate::DO_NOT_STRIP);

            //4. 开始完成渲染功能
            tpl->Expand(html, &root);//把root的内容填充到html,形成新的网页html
        }


        //第一个参数:某一道题目的细节 第二个参数:输出型参数,返回的是构建出的网页内容
        void OneExpandHtml(const struct Question &q, std::string *html)
        {
            // 1. 形成路径
            std::string src_html = template_path + "one_question.html";

            // 2. 形成数据字典
            ctemplate::TemplateDictionary root("one_question");
            root.SetValue("number", q.number); //题目编号
            root.SetValue("title", q.title);//题目标题
            root.SetValue("star", q.star);//题目难度
            root.SetValue("desc", q.desc);//题目描述
            root.SetValue("pre_code", q.header);

            //3. 获取被渲染的html
            ctemplate::Template *tpl = ctemplate::Template::GetTemplate(src_html, ctemplate::DO_NOT_STRIP);
           
            //4. 开始完成渲染功能
            tpl->Expand(html, &root);
        }
    };
}
